package com.sayimo.maker.commons.utils;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.commons.io.IOUtils;

import com.alibaba.simpleimage.ImageRender;
import com.alibaba.simpleimage.SimpleImageException;
import com.alibaba.simpleimage.render.ReadRender;
import com.alibaba.simpleimage.render.ScaleParameter;
import com.alibaba.simpleimage.render.ScaleRender;
import com.alibaba.simpleimage.render.WriteRender;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;  
/** 
 * 图片压缩处理 
 * @author 崔素强 
 */  
public class ImgCompress {  
    private static Image img;  
    private static int width;  
    private static int height;  
    private static String fileurl;
    
    /** 
     * 按照宽度还是高度进行压缩 
     * @param w int 最大宽度 
     * @param h int 最大高度 
     */  
    public static void resizeFix(String filePath,String fileName,int w, int h) throws IOException { 
    	File f =new File(filePath);
        if(!f.exists()){       
            f.mkdirs();
        } 
    	fileurl=filePath+fileName;
    	 File file = new File(fileurl);// 读入文件  
         img = ImageIO.read(file);      // 构造Image对象  
         width = img.getWidth(null);    // 得到源图宽  
         height = img.getHeight(null);  // 得到源图长  
         if(width>w||height>h){
        	 resize(w,h); 
         }
          
    }  
    /** 
     * 以宽度为基准，等比例放缩图片 
     * @param w int 新宽度 
     */  
    public static void resizeByWidth(int w) throws IOException {  
        int h = (int) (height * w / width);  
        resize(w, h);  
    }  
    /** 
     * 以高度为基准，等比例缩放图片 
     * @param h int 新高度 
     */  
    public static void resizeByHeight(int h) throws IOException {  
        int w = (int) (width * h / height);  
        resize(w, h);  
    }  
    /** 
     * 强制压缩/放大图片到自己设定固定的大小 ，图片会失真，先执行一遍resizeNew方法缩小图片后在执行该方法
     * @param w int 新宽度 
     * @param h int 新高度 
     */  
    public static void resize(int w, int h) throws IOException {  
    	
        // SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢  
        BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB );   
        image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图  
        File destFile = new File(fileurl);  
        FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流  
        // 可以正常实现bmp、png、gif转jpg  
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
        encoder.encode(image); // JPEG编码  
        out.close();  
    }  
    
    /** 
     * 强制压缩/放大图片，但是按照宽高比不变，不能按照自己设定的宽高，但不会失真
     * @param w int 新宽度 
     * @param h int 新高度 
     */  
    public static void resizeNew(String photoPath,String savePath,String photoName,int w, int h) throws IOException {  
    	File f =new File(photoPath);
        if(!f.exists()){       
            f.mkdirs();
        } 
        f =new File(savePath);
        if(!f.exists()){       
            f.mkdirs();
        } 
        
    	File in = new File(photoPath+photoName);      //原图片
	    File out = new File(savePath+photoName);       //目的图片
	    ScaleParameter scaleParam = new ScaleParameter(w, h); 
	     
	    FileInputStream inStream = null;
	    FileOutputStream outStream = null;
	    WriteRender wr = null;
	    try {
	        inStream = new FileInputStream(in);
	        outStream = new FileOutputStream(out);
	        ImageRender rr = new ReadRender(inStream);
	        ImageRender sr = new ScaleRender(rr, scaleParam);
	        wr = new WriteRender(sr, outStream);
	     
	        wr.render();                            //触发图像处理
	    } catch(Exception e) {
	        e.printStackTrace();
	    } finally {
	        IOUtils.closeQuietly(inStream);         //图片文件输入输出流必须记得关闭
	        IOUtils.closeQuietly(outStream);
	        if (wr != null) {
	            try {
	                wr.dispose();                   //释放simpleImage的内部资源
	            } catch (SimpleImageException ignore) {
	                // skip ... 
	            }
	        }
	    }
    }
}  